/*************************************************************************
功能: 智能指针make_unique兼容
说明: C++11及以下版本不支持make_unique，需做兼容处理，差异如：
    unique_ptr<int> p1(new int(1));            // 传统方式
    unique_ptr<int> p2 = make_unique<int>(1);  // C++14及以后
文件：unique_ptr_compat.h
*************************************************************************/

#ifndef __UNIQUE_PTR_COMPAT_H__
#define __UNIQUE_PTR_COMPAT_H__

#include <memory>
#include <utility> // 用于std::forward

// 仅在C++11环境下定义（C++14及以上使用标准库版本）
#if __cplusplus == 201103L
namespace std {
	// 普通类型: std::make_unique<MyClass>()
	template<typename T, typename... Args>
	typename enable_if<!is_array<T>::value, unique_ptr<T>>::type make_unique(Args &&...args) {
		static_assert(!std::is_abstract<T>::value, "Error: all pure virtual functions must be implemented.");
		return unique_ptr<T>(new T(forward<Args>(args)...));
	}

	// 数组类型: std::make_unique<MyClass[]>(n)
	template<typename T>
	typename enable_if<is_array<T>::value && extent<T>::value == 0, unique_ptr<T>>::type make_unique(size_t n) {
		using ElementType = typename remove_extent<T>::type;
		return unique_ptr<T>(new ElementType[n]());
	}

	// 删除 make_unique(T[N])
	template<typename T, typename... Args>
	typename enable_if<extent<T>::value != 0, unique_ptr<T>>::type make_unique(Args &&...) = delete;
} // namespace std
#endif // __cplusplus == 201103L
#endif // __UNIQUE_PTR_COMPAT_H__
